<script>
	import {
		mapState,
		mapActions,
		mapMutations
	} from 'vuex'
	import config from '@/admin.config.js'
	import manifest from '@/manifest.json'
	import {
		version
	} from './package.json'
	import {
		uniAdminCacheKey
	} from './store/constants.js'
	import {
		getinfo,
		userMenu
	} from '@/api/account';
	export default {
		data() {
			return {
				permise: ['/', config.index.url, config.error.url, config.error.permisd, config.login.url]
			}
		},
		created() {
			this.clear = undefined;
		},
		mounted() {
			// 示例：获取应用版本号
			uni.setStorageSync("getH5", this.getH5());
		},
		methods: {
			...mapMutations('app', ['SET_THEME']),
			...mapActions({
				init: 'app/init'
			}),
			getManifest(paramName) {
				if (typeof plus !== "undefined") {
					let manifest = plus.runtime.getManifest();
					return manifest[paramName];
				} else {
					// 在H5环境中获取manifest.json参数
					return manifest[paramName];
				}
			},
			getH5() {
				if (process.env.NODE_ENV === 'development') {
					var version = this.getManifest('h5');
					return version.router.base + '/'
				} else {
					return ''
				}
			},
			clearPlatform() {
				const keysOfPlatform = uni.getStorageInfoSync().keys.filter(key => key.indexOf('platform') > -1)
				keysOfPlatform.length && keysOfPlatform.forEach(key => uni.removeStorageSync(key))
			},
			// 无限级数组对象中返回path等于xx的对象
			findObjectByPath(arr, path, name = 'value') {
				for (let i = 0; i < arr.length; i++) {
					if (arr[i][name] === path) {
						return arr[i];
					}
					if (arr[i].children && arr[i].children.length > 0) {
						const found = this.findObjectByPath(arr[i].children, path);
						if (found) {
							return found;
						}
					}
				}
				return null;
			},
			// 无限级数组对象中包含指定
			containsString(arr, target, value = 'value') {
				for (let i = 0; i < arr.length; i++) {
					if (arr[i][value] === target) {
						return true;
					} else if (Array.isArray(arr[i])) {
						const result = containsString(arr[i][value], target);
						if (result) {
							return true;
						}
					}
				}
				return false;
			},
			// 无限级数组转单级
			flattenArray(arr) {
				let result = [];
				arr.forEach(item => {
					if (Array.isArray(item.children) && item.children[0]) {
						result = result.concat(this.flattenArray(item.children));
					} else {
						// 如果没有子元素，直接将当前元素添加到结果数组中
						result.push(item);
					}
				});
				return result;
			},
			permised(e) {
				// 检查权限
				let roles = uni.getStorageSync('userInfo')['roles'] || null; // 假设从存储中获取用户角色
				let Obj = config.sideBar.staticMenu.concat(this.permise);
				var paths = this.findObjectByPath(Obj, e);
				if (!paths || paths == null) {
					// 无权限，可以跳转到无权限提示页面
					uni.redirectTo({
						url: config.error.permisd,
					});
					return false; // 阻止跳转
				}
				let hasAuth = paths['roles'].includes(roles);
				if (!hasAuth) {
					return false; // 阻止跳转
					// 无权限，可以跳转到无权限提示页面
					uni.redirectTo({
						url: config.error.permisd,
					});

				}
				return true; // 有权限或没有设置权限，允许跳转
			},
			toRoute() {
				var that = this;
				// 使用reLaunch方法（关闭所有页面，打开到应用内的某个页面）
				// 使用navigateTo方法（保留当前页面，跳转到应用内的某个页面）
				// 使用redirectTo方法 （关闭当前页面，跳转到应用内的某个页面）
				// 使用widow方法（H5页面适用）
				// this.$forceUpdate();
				let arr = ['navigateTo', 'redirectTo', 'switchTab', 'reLaunch'];
				for (let i = 0; i < arr.length; i++) {
					uni.addInterceptor(arr[i], {
						invoke(e) {
							if (!that.permise.includes(e.url)) {
								that.permised(e.url); // 自定义导航守卫
							}
						}
					});
				}
			}
		},
		onPageNotFound(msg) {
			uni.redirectTo({
				url: config.error.url
			})
		},
		watch: {
			$route: {
				// immediate: true,
				handler(newRoute, oldRoute) {
					// console.log(newRoute.fullPath);
					if (!this.permise.includes(newRoute.fullPath)) {
						if (!this.permised(newRoute.fullPath)) {
							uni.redirectTo({
								url: config.error.permisd,
							});
						}
					}
				}
			},
		},
		onLaunch: function() {
			console.time('App Show');
			console.log('App Launch')
			// #ifdef H5
			console.log(
				`%c uni-admin %c v${version} `,
				'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px;  color: #fff',
				'background:#007aff ;padding: 1px; border-radius: 0 3px 3px 0;  color: #fff; font-weight: bold;'
			)
			// #endif
			// #ifdef H5
			// 此处为强制用户必须登录才能访问其他页面，如果需要部分页面不登录也能访问，需要在此过滤这些页面不执行下面的代码或直接注释掉此代码
			let uni_id_token_expired = uni.getStorageSync("token_expired");
			if (!uni_id_token_expired || uni_id_token_expired < Date.now()) {
				uni.reLaunch({
					url: config.login.url
				})
			}
			// #endif
			// 线上示例使用
			// console.log('%c uni-app官方团队诚邀优秀前端工程师加盟，一起打造更卓越的uni-app & uniCloud，欢迎投递简历到 hr2013@dcloud.io', 'color: red');
			// if (this.$uniIdPagesStore.store.hasLogin) {
			// 	this.init()
			// }

			// 登录成功回调
			uni.$on('uni-id-pages-login-success', () => {
				console.log('uni-id-pages-login-success');
				this.init()
			})

			// theme
			this.SET_THEME(uni.getStorageSync(uniAdminCacheKey.theme) || 'default')

			// 路由安全
			this.toRoute();
			
			console.timeEnd('App Show');
		},
		onShow: function() {
			this.clear = setInterval(() => this.clearPlatform(), 15 * 60 * 1000)
		},
		onHide: function() {
			console.log('App Hide')
			this.clear && clearInterval(this.clear)
		}
	}
</script>

<style lang="scss">
	/*每个页面公共css */
	@import '@/common/uni.css';
	@import '@/common/uni-icons.css';
	@import '@/common/admin-icons.css';
	@import '@/common/theme.scss';
</style>